package com.expert.miniapp.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * DemandDTO - 需求数据传输对象
 * 用于前端表单数据的接收和传输
 *
 * @author System
 * @since 2025-10-19
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
public class DemandDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    private String demandId;

    @NotBlank(message = "用户ID不能为空")
    private String userId;

    private String demandStatus;
    private LocalDateTime createdAt;
    private LocalDateTime submittedAt;

    @NotBlank(message = "研究目标不能为空")
    @Size(max = 5000, message = "研究目标长度不能超过5000字符")
    private String researchObjective;

    @Size(max = 5000, message = "核心技术挑战长度不能超过5000字符")
    private String coreTechnicalChallenges;

    @Size(max = 5000, message = "应用场景长度不能超过5000字符")
    private String applicationScenario;

    @Size(max = 5000, message = "预期成果长度不能超过5000字符")
    private String expectedOutcomes;

    @Size(max = 5000, message = "当前技术状态长度不能超过5000字符")
    private String currentTechnologyStatus;

    @Size(max = 5000, message = "技术领域长度不能超过5000字符")
    private String technologyField;

    @Size(max = 50, message = "当前研究阶段长度不能超过50字符")
    private String currentResearchStage;

    @Size(max = 500, message = "文档上传路径长度不能超过500字符")
    private String documentUpload;

    @Size(max = 5000, message = "资源类型选择长度不能超过5000字符")
    private String resourceTypeSelection;

    @Size(max = 5000, message = "专家类型长度不能超过5000字符")
    private String expertType;

    @Size(max = 5000, message = "专家要求长度不能超过5000字符")
    private String expertRequirements;

    @Size(max = 5000, message = "成果类型长度不能超过5000字符")
    private String achievementType;

    @Size(max = 50, message = "技术成熟度长度不能超过50字符")
    private String technologyMaturity;

    @Size(max = 5000, message = "实验室类型长度不能超过5000字符")
    private String laboratoryType;

    @Size(max = 5000, message = "面积要求长度不能超过5000字符")
    private String areaRequirement;

    @Size(max = 5000, message = "设备类型长度不能超过5000字符")
    private String equipmentType;

    @Size(max = 50, message = "使用时长长度不能超过50字符")
    private String usageDuration;

    @Size(max = 5000, message = "其他资源长度不能超过5000字符")
    private String otherResources;

    @Size(max = 5000, message = "合作形式长度不能超过5000字符")
    private String cooperationForm;

    @Size(max = 50, message = "预算范围长度不能超过50字符")
    private String budgetRange;

    @Size(max = 50, message = "时间要求长度不能超过50字符")
    private String timelineRequirement;

    @Size(max = 5000, message = "地域要求长度不能超过5000字符")
    private String regionalRequirement;

    @Size(max = 50, message = "知识产权长度不能超过50字符")
    private String intellectualProperty;

    @Size(max = 50, message = "紧急程度长度不能超过50字符")
    private String urgencyLevel;

    @Size(max = 50, message = "期望联系时间长度不能超过50字符")
    private String expectedContactTime;

    @Size(max = 50, message = "保密要求长度不能超过50字符")
    private String confidentialityRequirement;

    // Constructors
    public DemandDTO() {
    }

    // Getters and Setters
    public String getDemandId() {
        return demandId;
    }

    public void setDemandId(String demandId) {
        this.demandId = demandId;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getDemandStatus() {
        return demandStatus;
    }

    public void setDemandStatus(String demandStatus) {
        this.demandStatus = demandStatus;
    }

    public LocalDateTime getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(LocalDateTime createdAt) {
        this.createdAt = createdAt;
    }

    public LocalDateTime getSubmittedAt() {
        return submittedAt;
    }

    public void setSubmittedAt(LocalDateTime submittedAt) {
        this.submittedAt = submittedAt;
    }

    public String getResearchObjective() {
        return researchObjective;
    }

    public void setResearchObjective(String researchObjective) {
        this.researchObjective = researchObjective;
    }

    public String getCoreTechnicalChallenges() {
        return coreTechnicalChallenges;
    }

    public void setCoreTechnicalChallenges(String coreTechnicalChallenges) {
        this.coreTechnicalChallenges = coreTechnicalChallenges;
    }

    public String getApplicationScenario() {
        return applicationScenario;
    }

    public void setApplicationScenario(String applicationScenario) {
        this.applicationScenario = applicationScenario;
    }

    public String getExpectedOutcomes() {
        return expectedOutcomes;
    }

    public void setExpectedOutcomes(String expectedOutcomes) {
        this.expectedOutcomes = expectedOutcomes;
    }

    public String getCurrentTechnologyStatus() {
        return currentTechnologyStatus;
    }

    public void setCurrentTechnologyStatus(String currentTechnologyStatus) {
        this.currentTechnologyStatus = currentTechnologyStatus;
    }

    public String getTechnologyField() {
        return technologyField;
    }

    public void setTechnologyField(String technologyField) {
        this.technologyField = technologyField;
    }

    public String getCurrentResearchStage() {
        return currentResearchStage;
    }

    public void setCurrentResearchStage(String currentResearchStage) {
        this.currentResearchStage = currentResearchStage;
    }

    public String getDocumentUpload() {
        return documentUpload;
    }

    public void setDocumentUpload(String documentUpload) {
        this.documentUpload = documentUpload;
    }

    public String getResourceTypeSelection() {
        return resourceTypeSelection;
    }

    public void setResourceTypeSelection(String resourceTypeSelection) {
        this.resourceTypeSelection = resourceTypeSelection;
    }

    public String getExpertType() {
        return expertType;
    }

    public void setExpertType(String expertType) {
        this.expertType = expertType;
    }

    public String getExpertRequirements() {
        return expertRequirements;
    }

    public void setExpertRequirements(String expertRequirements) {
        this.expertRequirements = expertRequirements;
    }

    public String getAchievementType() {
        return achievementType;
    }

    public void setAchievementType(String achievementType) {
        this.achievementType = achievementType;
    }

    public String getTechnologyMaturity() {
        return technologyMaturity;
    }

    public void setTechnologyMaturity(String technologyMaturity) {
        this.technologyMaturity = technologyMaturity;
    }

    public String getLaboratoryType() {
        return laboratoryType;
    }

    public void setLaboratoryType(String laboratoryType) {
        this.laboratoryType = laboratoryType;
    }

    public String getAreaRequirement() {
        return areaRequirement;
    }

    public void setAreaRequirement(String areaRequirement) {
        this.areaRequirement = areaRequirement;
    }

    public String getEquipmentType() {
        return equipmentType;
    }

    public void setEquipmentType(String equipmentType) {
        this.equipmentType = equipmentType;
    }

    public String getUsageDuration() {
        return usageDuration;
    }

    public void setUsageDuration(String usageDuration) {
        this.usageDuration = usageDuration;
    }

    public String getOtherResources() {
        return otherResources;
    }

    public void setOtherResources(String otherResources) {
        this.otherResources = otherResources;
    }

    public String getCooperationForm() {
        return cooperationForm;
    }

    public void setCooperationForm(String cooperationForm) {
        this.cooperationForm = cooperationForm;
    }

    public String getBudgetRange() {
        return budgetRange;
    }

    public void setBudgetRange(String budgetRange) {
        this.budgetRange = budgetRange;
    }

    public String getTimelineRequirement() {
        return timelineRequirement;
    }

    public void setTimelineRequirement(String timelineRequirement) {
        this.timelineRequirement = timelineRequirement;
    }

    public String getRegionalRequirement() {
        return regionalRequirement;
    }

    public void setRegionalRequirement(String regionalRequirement) {
        this.regionalRequirement = regionalRequirement;
    }

    public String getIntellectualProperty() {
        return intellectualProperty;
    }

    public void setIntellectualProperty(String intellectualProperty) {
        this.intellectualProperty = intellectualProperty;
    }

    public String getUrgencyLevel() {
        return urgencyLevel;
    }

    public void setUrgencyLevel(String urgencyLevel) {
        this.urgencyLevel = urgencyLevel;
    }

    public String getExpectedContactTime() {
        return expectedContactTime;
    }

    public void setExpectedContactTime(String expectedContactTime) {
        this.expectedContactTime = expectedContactTime;
    }

    public String getConfidentialityRequirement() {
        return confidentialityRequirement;
    }

    public void setConfidentialityRequirement(String confidentialityRequirement) {
        this.confidentialityRequirement = confidentialityRequirement;
    }
}
